{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-platform-directory-ldap",
      "artifactVersion": "2025.27.34",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.ecm.directory",
          "org.nuxeo.ecm.directory.api",
          "org.nuxeo.ecm.directory.ldap",
          "org.nuxeo.ecm.directory.multi",
          "org.nuxeo.ecm.directory.sql",
          "org.nuxeo.ecm.directory.types.contrib"
        ],
        "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory",
        "id": "grp:org.nuxeo.ecm.directory",
        "name": "org.nuxeo.ecm.directory",
        "parentIds": [
          "grp:org.nuxeo.ecm.platform"
        ],
        "readmes": [],
        "version": "2025.27"
      },
      "bundleId": "org.nuxeo.ecm.directory.ldap",
      "components": [
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.management.CoreManagementComponent--probes",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.management/Contributions/org.nuxeo.ecm.directory.ldap.management--probes",
              "id": "org.nuxeo.ecm.directory.ldap.management--probes",
              "registrationOrder": 2,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.management.CoreManagementComponent",
                "name": "org.nuxeo.ecm.core.management.CoreManagementComponent",
                "type": "service"
              },
              "version": "2025.27.34",
              "xml": "<extension point=\"probes\" target=\"org.nuxeo.ecm.core.management.CoreManagementComponent\">\n         <probe class=\"org.nuxeo.ecm.directory.ldap.management.LDAPDirectoriesProbe\" name=\"ldapDirectories\">\n            <label>LDAP probe</label>\n            <description>Test access on each declared LDAP Directory</description>\n         </probe>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.management.CoreManagementComponent--healthCheck",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.management/Contributions/org.nuxeo.ecm.directory.ldap.management--healthCheck",
              "id": "org.nuxeo.ecm.directory.ldap.management--healthCheck",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.management.CoreManagementComponent",
                "name": "org.nuxeo.ecm.core.management.CoreManagementComponent",
                "type": "service"
              },
              "version": "2025.27.34",
              "xml": "<extension point=\"healthCheck\" target=\"org.nuxeo.ecm.core.management.CoreManagementComponent\">\n     <probe enabled=\"true\" name=\"ldapDirectories\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.management",
          "name": "org.nuxeo.ecm.directory.ldap.management",
          "requirements": [],
          "resolutionOrder": 310,
          "services": [],
          "startOrder": 185,
          "version": "2025.27.34",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.directory.ldap.management\">\n\n <extension\n    target=\"org.nuxeo.ecm.core.management.CoreManagementComponent\"\n    point=\"probes\">\n         <probe name=\"ldapDirectories\"\n                  class=\"org.nuxeo.ecm.directory.ldap.management.LDAPDirectoriesProbe\">\n            <label>LDAP probe</label>\n            <description>Test access on each declared LDAP Directory</description>\n         </probe>\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.core.management.CoreManagementComponent\" point=\"healthCheck\">\n     <probe name=\"ldapDirectories\" enabled=\"true\"/>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/management-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
          "documentation": "\n    The LDAPDirectoryFactory component provides implementation of the\n    Directory API using an external LDAP server as storage backend,\n    typically to fetch users and groups data check password based\n    authentication.\n\n    @author Olivier Grisel (ogrisel@nuxeo.com)\n  \n",
          "documentationHtml": "<p>\nThe LDAPDirectoryFactory component provides implementation of the\nDirectory API using an external LDAP server as storage backend,\ntypically to fetch users and groups data check password based\nauthentication.\n</p><p></p>",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
              "descriptors": [
                "org.nuxeo.ecm.directory.ldap.LDAPServerDescriptor"
              ],
              "documentation": "\n      The servers extension point is used to register network connection\n      parameters to a pool of LDAP servers.\n\n      Examples:\n\n      <code>\n    <server name=\"default\">\n        <ldapUrl>ldap://localhost:389</ldapUrl>\n        <ldapUrl>ldap://server2:389</ldapUrl>\n        <ldapUrl>ldaps://server3:389</ldapUrl>\n        <!-- LDAP SRV DNS resolution on _ldap._tcp.example.com -->\n        <ldapUrl>ldap:///dc=example,dc=com</ldapUrl>\n        <!-- LDAP SRV DNS resolution on _gc._tcp.example.com -->\n        <ldapUrl srvPrefix=\"_gc._tcp\">ldap:///dc=example,dc=com</ldapUrl>\n        <connectionTimeout>10000</connectionTimeout>\n        <retries>5</retries>\n        <poolingEnabled>true</poolingEnabled>\n        <poolingConnectionTimeout>60000</poolingConnectionTimeout>\n        <verifyServerCert>true</verifyServerCert>\n        <bindDn>cn=nuxeo5,ou=applications,dc=example,dc=com</bindDn>\n        <bindPassword>changeme</bindPassword>\n    </server>\n</code>\n\n\n      The ldapUrl tags point to server (IP address or DNS name) and\n      ports. If more than one is provided, the Nuxeo EP will use a pool\n      of load balanced connections to each server. They are assumed to\n      be replicated versions of a master server that should belong to\n      the list.\n\n      The connectionTimeout element specifies a connection timeout in milliseconds.\n      The default is 10000.\n\n      The retries element indicates how many times the request will be retried\n      if LDAP server returns a ServiceUnavailableException. The default is 5.\n\n      The poolingEnabled element specifies whether to use LDAP connection pooling.\n      The default is true.\n\n      The poolingTimeout element specifies, in milliseconds, how long a connection\n      may remain in the pool when LDAP connection pooling is enabled.\n      The default is 60000.\n\n      The verifyServerCert element specifies whether, in SSL mode, all certificates\n      should be checked. This should only be disabled when testing with test server\n      having self-signed certificates. The default is true.\n\n      The bindDn and bindPassword credentials are used by Nuxeo EP to\n      access the content of the LDAP servers. It should have the read\n      permission to any entry that is to be used by Nuxeo EP and write\n      right to branches were Nuxeo EP is supposed to create or edit\n      entries.\n\n      For instance, in OpenLDAP you should have ACLs such as:\n\n      <code>\n        access to attrs=\"userPassword\"\n        by dn=\"cn=ldapadmin,dc=example,dc=com\" write\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by anonymous auth\n        by self write\n        by * none\n\n        access to dn.base=\"\" by * read\n\n        # nuxeo5 can manage the ou=people branch\n        access to dn.subtree=\"ou=people,dc=example,dc=com\"\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by users read\n        by self write\n        by * none\n\n        access to dn.subtree=\"ou=groups,dc=example,dc=com\"\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by users read\n        by self write\n        by * none\n\n        # The admin dn has full write access\n        # other\n        access to *\n        by dn=\"cn=ldapadmin,dc=example,dc=com\" write\n        by users read\n        by * none\n      </code>\n\n\n      User authentication is done using a bind method against the user\n      provided login and password from the login form and not the bindDn\n      / bindPassword credentials.\n    \n",
              "documentationHtml": "<p>\nThe servers extension point is used to register network connection\nparameters to a pool of LDAP servers.\n</p><p>\nExamples:\n</p><p>\n</p><pre><code>    &lt;server name&#61;&#34;default&#34;&gt;\n        &lt;ldapUrl&gt;ldap://localhost:389&lt;/ldapUrl&gt;\n        &lt;ldapUrl&gt;ldap://server2:389&lt;/ldapUrl&gt;\n        &lt;ldapUrl&gt;ldaps://server3:389&lt;/ldapUrl&gt;\n        &lt;!-- LDAP SRV DNS resolution on _ldap._tcp.example.com --&gt;\n        &lt;ldapUrl&gt;ldap:///dc&#61;example,dc&#61;com&lt;/ldapUrl&gt;\n        &lt;!-- LDAP SRV DNS resolution on _gc._tcp.example.com --&gt;\n        &lt;ldapUrl srvPrefix&#61;&#34;_gc._tcp&#34;&gt;ldap:///dc&#61;example,dc&#61;com&lt;/ldapUrl&gt;\n        &lt;connectionTimeout&gt;10000&lt;/connectionTimeout&gt;\n        &lt;retries&gt;5&lt;/retries&gt;\n        &lt;poolingEnabled&gt;true&lt;/poolingEnabled&gt;\n        &lt;poolingConnectionTimeout&gt;60000&lt;/poolingConnectionTimeout&gt;\n        &lt;verifyServerCert&gt;true&lt;/verifyServerCert&gt;\n        &lt;bindDn&gt;cn&#61;nuxeo5,ou&#61;applications,dc&#61;example,dc&#61;com&lt;/bindDn&gt;\n        &lt;bindPassword&gt;changeme&lt;/bindPassword&gt;\n    &lt;/server&gt;\n</code></pre><p>\nThe ldapUrl tags point to server (IP address or DNS name) and\nports. If more than one is provided, the Nuxeo EP will use a pool\nof load balanced connections to each server. They are assumed to\nbe replicated versions of a master server that should belong to\nthe list.\n</p><p>\nThe connectionTimeout element specifies a connection timeout in milliseconds.\nThe default is 10000.\n</p><p>\nThe retries element indicates how many times the request will be retried\nif LDAP server returns a ServiceUnavailableException. The default is 5.\n</p><p>\nThe poolingEnabled element specifies whether to use LDAP connection pooling.\nThe default is true.\n</p><p>\nThe poolingTimeout element specifies, in milliseconds, how long a connection\nmay remain in the pool when LDAP connection pooling is enabled.\nThe default is 60000.\n</p><p>\nThe verifyServerCert element specifies whether, in SSL mode, all certificates\nshould be checked. This should only be disabled when testing with test server\nhaving self-signed certificates. The default is true.\n</p><p>\nThe bindDn and bindPassword credentials are used by Nuxeo EP to\naccess the content of the LDAP servers. It should have the read\npermission to any entry that is to be used by Nuxeo EP and write\nright to branches were Nuxeo EP is supposed to create or edit\nentries.\n</p><p>\nFor instance, in OpenLDAP you should have ACLs such as:\n</p><p>\n</p><pre><code>        access to attrs&#61;&#34;userPassword&#34;\n        by dn&#61;&#34;cn&#61;ldapadmin,dc&#61;example,dc&#61;com&#34; write\n        by dn&#61;&#34;cn&#61;nuxeo5,ou&#61;applications,dc&#61;example,dc&#61;com&#34; write\n        by anonymous auth\n        by self write\n        by * none\n\n        access to dn.base&#61;&#34;&#34; by * read\n\n        # nuxeo5 can manage the ou&#61;people branch\n        access to dn.subtree&#61;&#34;ou&#61;people,dc&#61;example,dc&#61;com&#34;\n        by dn&#61;&#34;cn&#61;nuxeo5,ou&#61;applications,dc&#61;example,dc&#61;com&#34; write\n        by users read\n        by self write\n        by * none\n\n        access to dn.subtree&#61;&#34;ou&#61;groups,dc&#61;example,dc&#61;com&#34;\n        by dn&#61;&#34;cn&#61;nuxeo5,ou&#61;applications,dc&#61;example,dc&#61;com&#34; write\n        by users read\n        by self write\n        by * none\n\n        # The admin dn has full write access\n        # other\n        access to *\n        by dn&#61;&#34;cn&#61;ldapadmin,dc&#61;example,dc&#61;com&#34; write\n        by users read\n        by * none\n</code></pre><p>\nUser authentication is done using a bind method against the user\nprovided login and password from the login form and not the bindDn\n/ bindPassword credentials.\n</p><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory/ExtensionPoints/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory--servers",
              "id": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory--servers",
              "label": "servers (org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory)",
              "name": "servers",
              "version": "2025.27.34"
            },
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
              "descriptors": [
                "org.nuxeo.ecm.directory.ldap.LDAPDirectoryDescriptor"
              ],
              "documentation": "\n      The directories extension point is used to register LDAP filtering\n      parameters to identify which part of the LDAP branches are actually\n      used by Nuxeo EP to fetch its entries.\n\n      Examples:\n\n      <code>\n    <directory name=\"userDirectory\">\n        <server>default</server>\n        <schema>user</schema>\n        <types>\n            <type>system</type>\n        </types>\n        <idField>username</idField>\n        <idCase>unchanged</idCase>\n        <passwordField>password</passwordField>\n        <passwordHashAlgorithm>SSHA</passwordHashAlgorithm>\n        <searchBaseDn>ou=people,dc=example,dc=com</searchBaseDn>\n        <searchClass>person</searchClass>\n        <searchFilter>(&amp;(sn=toto*)(myCustomAttribute=somevalue))</searchFilter>\n        <searchScope>onelevel</searchScope>\n        <readOnly>false</readOnly>\n        <cacheTimeout>3600</cacheTimeout>\n        <cacheMaxSize>1000</cacheMaxSize>\n        <creationBaseDn>ou=people,dc=example,dc=com</creationBaseDn>\n        <creationClass>top</creationClass>\n        <creationClass>person</creationClass>\n        <creationClass>organizationalPerson</creationClass>\n        <creationClass>inetOrgPerson</creationClass>\n        <rdnAttribute>uid</rdnAttribute>\n        <querySizeLimit>200</querySizeLimit>\n        <queryTimeLimit>0</queryTimeLimit>\n        <fieldMapping name=\"username\">uid</fieldMapping>\n        <fieldMapping name=\"password\">userPassword</fieldMapping>\n        <fieldMapping name=\"firstName\">givenName</fieldMapping>\n        <fieldMapping name=\"lastName\">sn</fieldMapping>\n        <fieldMapping name=\"company\">o</fieldMapping>\n        <fieldMapping name=\"email\">mail</fieldMapping>\n        <references>\n            <inverseReference directory=\"groupDirectory\"\n                dualReferenceField=\"members\" field=\"groups\"/>\n        </references>\n    </directory>\n    <directory name=\"groupDirectory\">\n        <server>default</server>\n        <schema>group</schema>\n        <idField>groupname</idField>\n        <searchBaseDn>ou=groups,dc=example,dc=com</searchBaseDn>\n        <searchFilter>(|(objectClass=groupOfUniqueNames)(objectClass=groupOfURLs))</searchFilter>\n        <searchScope>subtree</searchScope>\n        <!-- Special entry adaptor that makes entries in the ou=editable branch editable\n          other entries have the readonly flag. This require adding a \"dn\" xs:string field\n          to the group schema.\n          -->\n        <entryAdaptor class=\"org.nuxeo.ecm.directory.impl.WritePolicyEntryAdaptor\">\n            <parameter name=\"fieldName\">dn</parameter>\n            <parameter name=\"regexp\">.*,ou=editable,ou=groups,dc=example,dc=com</parameter>\n        </entryAdaptor>\n        <readOnly>false</readOnly>\n        <cacheTimeout>3600</cacheTimeout>\n        <cacheMaxSize>1000</cacheMaxSize>\n        <creationBaseDn>ou=editable,ou=groups,dc=example,dc=com</creationBaseDn>\n        <creationClass>top</creationClass>\n        <creationClass>groupOfUniqueNames</creationClass>\n        <rdnAttribute>cn</rdnAttribute>\n        <querySizeLimit>200</querySizeLimit>\n        <queryTimeLimit>0</queryTimeLimit>\n        <fieldMapping name=\"groupname\">cn</fieldMapping>\n        <references>\n            <!-- LDAP reference resolve DNs embedded in uniqueMember attributes\n\n              If the target directory has no specific filtering policy, it is most\n              of the time not necessary to enable the 'forceDnConsistencyCheck' policy.\n\n              Enabling this option will fetch each reference entry to ensure its\n              existence in the target directory.\n            -->\n            <ldapReference directory=\"userDirectory\"\n                dynamicAttributeId=\"memberURL\" field=\"members\"\n                forceDnConsistencyCheck=\"false\"\n                staticAttributeId=\"uniqueMember\" staticAttributeIdIsDn=\"true\"/>\n            <ldapReference directory=\"groupDirectory\"\n                dynamicAttributeId=\"memberURL\" field=\"subGroups\"\n                forceDnConsistencyCheck=\"false\" staticAttributeId=\"uniqueMember\"/>\n            <inverseReference directory=\"groupDirectory\"\n                dualReferenceField=\"subGroups\" field=\"parentGroups\"/>\n            <ldapTreeReference directory=\"groupDirectory\"\n                field=\"children\" scope=\"onelevel\"/>\n            <inverseReference directory=\"groupDirectory\"\n                dualReferenceField=\"children\" field=\"parents\"/>\n        </references>\n    </directory>\n</code>\n\n\n      In the previous examples we configured two directories one for the\n      users and one for the groups of users. Each directory uses a\n      single schema which is to be registered as any core document\n      schema and that will be used to build a DocumentModel for each\n      matching entry of the directory.\n\n\n      Nuxeo EP provides group resolution for statically dn-referenced\n      entries (in read and write mode) and for dynamically ldapUrl\n      matched entries (readonly). You may also need to statically\n      reference entries without a dn using the 'staticAttributeIdIsDn'\n      attribute.\n\n      The references tags are used to dynamically build nxs:stringList\n      fields of that schema that are to compute membership relationships\n      between users and groups or between parent groups and sub groups.\n      It can also resole children and parents following the ldap tree\n      structure.\n\n      You have two ways for declaring a dynamic reference in a 'references' tag.\n      You can use 'dynamicAttributeId' to point to an ldap attribute that\n      contains an ldap url.\n\n      <code>\n    <ldapReference directory=\"userDirectory\"\n        dynamicAttributeId=\"memberURL\" field=\"members\"/>\n</code>\n\n\n      Or, you can use a subtag 'dynamicReference' to declare attributes that\n      contain a DN, a filter and a type. This values will be used to selected\n      the references.\n\n      <code>\n    <ldapReference directory=\"userDirectory\" field=\"members\"/>\n    <dynamicReference baseDN=\"ldapAttribute\" filter=\"ldapAttribute\" type=\"subtree/onelevel\"/>\n    <ldapReference/>\n</code>\n\n\n      When using dynamic references, caching is advised since dynamic group\n      resolution can be expensive.\n\n      The element \"idCase\" makes it possible to control the case of the\n      identifier on Nuxeo side. It accepts values \"upper\", \"lower\" or\n      \"unchanged\". It is useful when changing case on the LDAP without affecting\n      Nuxeo (for rights management for instance which is case sensitive for\n      instance).\n\n\n      Dependening on your LDAP Backend implementation, if you have some specific restriction\n      (for example on password, or logins ...), you may want Nuxeo to handle the validation\n      errors of your server on the Nuxeo side.\n\n      Since there error code and message may vary  depending on the LDAP server provider, you\n      may need to provide a custom class that knows how to handle the Exceptions returned by it.\n\n      For this you can specify a class that will be in charge of this task.\n      <code>\n    <ldapExceptionHandler>org.nuxeo.ecm.directory.ldap.DefaultLdapExceptionProcessor</ldapExceptionHandler>\n</code>\n\n      This class should implement org.nuxeo.ecm.directory.ldap.LdapExceptionProcessor and return\n      a RecoverableClientException for any exception that should be displayed to the user.\n\n\n      By default, referrals will be automatically resolved, if you don't want that behavior (since 5.9.4) you can use the followReferrals tag\n\n      <code>\n    <directory name=\"groupDirectory\">\n           ....\n           <followReferrals>false</followReferrals>\n           ...\n        </directory>\n</code>\n",
              "documentationHtml": "<p>\nThe directories extension point is used to register LDAP filtering\nparameters to identify which part of the LDAP branches are actually\nused by Nuxeo EP to fetch its entries.\n</p><p>\nExamples:\n</p><p>\n</p><pre><code>    &lt;directory name&#61;&#34;userDirectory&#34;&gt;\n        &lt;server&gt;default&lt;/server&gt;\n        &lt;schema&gt;user&lt;/schema&gt;\n        &lt;types&gt;\n            &lt;type&gt;system&lt;/type&gt;\n        &lt;/types&gt;\n        &lt;idField&gt;username&lt;/idField&gt;\n        &lt;idCase&gt;unchanged&lt;/idCase&gt;\n        &lt;passwordField&gt;password&lt;/passwordField&gt;\n        &lt;passwordHashAlgorithm&gt;SSHA&lt;/passwordHashAlgorithm&gt;\n        &lt;searchBaseDn&gt;ou&#61;people,dc&#61;example,dc&#61;com&lt;/searchBaseDn&gt;\n        &lt;searchClass&gt;person&lt;/searchClass&gt;\n        &lt;searchFilter&gt;(&amp;amp;(sn&#61;toto*)(myCustomAttribute&#61;somevalue))&lt;/searchFilter&gt;\n        &lt;searchScope&gt;onelevel&lt;/searchScope&gt;\n        &lt;readOnly&gt;false&lt;/readOnly&gt;\n        &lt;cacheTimeout&gt;3600&lt;/cacheTimeout&gt;\n        &lt;cacheMaxSize&gt;1000&lt;/cacheMaxSize&gt;\n        &lt;creationBaseDn&gt;ou&#61;people,dc&#61;example,dc&#61;com&lt;/creationBaseDn&gt;\n        &lt;creationClass&gt;top&lt;/creationClass&gt;\n        &lt;creationClass&gt;person&lt;/creationClass&gt;\n        &lt;creationClass&gt;organizationalPerson&lt;/creationClass&gt;\n        &lt;creationClass&gt;inetOrgPerson&lt;/creationClass&gt;\n        &lt;rdnAttribute&gt;uid&lt;/rdnAttribute&gt;\n        &lt;querySizeLimit&gt;200&lt;/querySizeLimit&gt;\n        &lt;queryTimeLimit&gt;0&lt;/queryTimeLimit&gt;\n        &lt;fieldMapping name&#61;&#34;username&#34;&gt;uid&lt;/fieldMapping&gt;\n        &lt;fieldMapping name&#61;&#34;password&#34;&gt;userPassword&lt;/fieldMapping&gt;\n        &lt;fieldMapping name&#61;&#34;firstName&#34;&gt;givenName&lt;/fieldMapping&gt;\n        &lt;fieldMapping name&#61;&#34;lastName&#34;&gt;sn&lt;/fieldMapping&gt;\n        &lt;fieldMapping name&#61;&#34;company&#34;&gt;o&lt;/fieldMapping&gt;\n        &lt;fieldMapping name&#61;&#34;email&#34;&gt;mail&lt;/fieldMapping&gt;\n        &lt;references&gt;\n            &lt;inverseReference directory&#61;&#34;groupDirectory&#34;\n                dualReferenceField&#61;&#34;members&#34; field&#61;&#34;groups&#34;/&gt;\n        &lt;/references&gt;\n    &lt;/directory&gt;\n    &lt;directory name&#61;&#34;groupDirectory&#34;&gt;\n        &lt;server&gt;default&lt;/server&gt;\n        &lt;schema&gt;group&lt;/schema&gt;\n        &lt;idField&gt;groupname&lt;/idField&gt;\n        &lt;searchBaseDn&gt;ou&#61;groups,dc&#61;example,dc&#61;com&lt;/searchBaseDn&gt;\n        &lt;searchFilter&gt;(|(objectClass&#61;groupOfUniqueNames)(objectClass&#61;groupOfURLs))&lt;/searchFilter&gt;\n        &lt;searchScope&gt;subtree&lt;/searchScope&gt;\n        &lt;!-- Special entry adaptor that makes entries in the ou&#61;editable branch editable\n          other entries have the readonly flag. This require adding a &#34;dn&#34; xs:string field\n          to the group schema.\n          --&gt;\n        &lt;entryAdaptor class&#61;&#34;org.nuxeo.ecm.directory.impl.WritePolicyEntryAdaptor&#34;&gt;\n            &lt;parameter name&#61;&#34;fieldName&#34;&gt;dn&lt;/parameter&gt;\n            &lt;parameter name&#61;&#34;regexp&#34;&gt;.*,ou&#61;editable,ou&#61;groups,dc&#61;example,dc&#61;com&lt;/parameter&gt;\n        &lt;/entryAdaptor&gt;\n        &lt;readOnly&gt;false&lt;/readOnly&gt;\n        &lt;cacheTimeout&gt;3600&lt;/cacheTimeout&gt;\n        &lt;cacheMaxSize&gt;1000&lt;/cacheMaxSize&gt;\n        &lt;creationBaseDn&gt;ou&#61;editable,ou&#61;groups,dc&#61;example,dc&#61;com&lt;/creationBaseDn&gt;\n        &lt;creationClass&gt;top&lt;/creationClass&gt;\n        &lt;creationClass&gt;groupOfUniqueNames&lt;/creationClass&gt;\n        &lt;rdnAttribute&gt;cn&lt;/rdnAttribute&gt;\n        &lt;querySizeLimit&gt;200&lt;/querySizeLimit&gt;\n        &lt;queryTimeLimit&gt;0&lt;/queryTimeLimit&gt;\n        &lt;fieldMapping name&#61;&#34;groupname&#34;&gt;cn&lt;/fieldMapping&gt;\n        &lt;references&gt;\n            &lt;!-- LDAP reference resolve DNs embedded in uniqueMember attributes\n\n              If the target directory has no specific filtering policy, it is most\n              of the time not necessary to enable the &#39;forceDnConsistencyCheck&#39; policy.\n\n              Enabling this option will fetch each reference entry to ensure its\n              existence in the target directory.\n            --&gt;\n            &lt;ldapReference directory&#61;&#34;userDirectory&#34;\n                dynamicAttributeId&#61;&#34;memberURL&#34; field&#61;&#34;members&#34;\n                forceDnConsistencyCheck&#61;&#34;false&#34;\n                staticAttributeId&#61;&#34;uniqueMember&#34; staticAttributeIdIsDn&#61;&#34;true&#34;/&gt;\n            &lt;ldapReference directory&#61;&#34;groupDirectory&#34;\n                dynamicAttributeId&#61;&#34;memberURL&#34; field&#61;&#34;subGroups&#34;\n                forceDnConsistencyCheck&#61;&#34;false&#34; staticAttributeId&#61;&#34;uniqueMember&#34;/&gt;\n            &lt;inverseReference directory&#61;&#34;groupDirectory&#34;\n                dualReferenceField&#61;&#34;subGroups&#34; field&#61;&#34;parentGroups&#34;/&gt;\n            &lt;ldapTreeReference directory&#61;&#34;groupDirectory&#34;\n                field&#61;&#34;children&#34; scope&#61;&#34;onelevel&#34;/&gt;\n            &lt;inverseReference directory&#61;&#34;groupDirectory&#34;\n                dualReferenceField&#61;&#34;children&#34; field&#61;&#34;parents&#34;/&gt;\n        &lt;/references&gt;\n    &lt;/directory&gt;\n</code></pre><p>\nIn the previous examples we configured two directories one for the\nusers and one for the groups of users. Each directory uses a\nsingle schema which is to be registered as any core document\nschema and that will be used to build a DocumentModel for each\nmatching entry of the directory.\n</p><p>\nNuxeo EP provides group resolution for statically dn-referenced\nentries (in read and write mode) and for dynamically ldapUrl\nmatched entries (readonly). You may also need to statically\nreference entries without a dn using the &#39;staticAttributeIdIsDn&#39;\nattribute.\n</p><p>\nThe references tags are used to dynamically build nxs:stringList\nfields of that schema that are to compute membership relationships\nbetween users and groups or between parent groups and sub groups.\nIt can also resole children and parents following the ldap tree\nstructure.\n</p><p>\nYou have two ways for declaring a dynamic reference in a &#39;references&#39; tag.\nYou can use &#39;dynamicAttributeId&#39; to point to an ldap attribute that\ncontains an ldap url.\n</p><p>\n</p><pre><code>    &lt;ldapReference directory&#61;&#34;userDirectory&#34;\n        dynamicAttributeId&#61;&#34;memberURL&#34; field&#61;&#34;members&#34;/&gt;\n</code></pre><p>\nOr, you can use a subtag &#39;dynamicReference&#39; to declare attributes that\ncontain a DN, a filter and a type. This values will be used to selected\nthe references.\n</p><p>\n</p><pre><code>    &lt;ldapReference directory&#61;&#34;userDirectory&#34; field&#61;&#34;members&#34;/&gt;\n    &lt;dynamicReference baseDN&#61;&#34;ldapAttribute&#34; filter&#61;&#34;ldapAttribute&#34; type&#61;&#34;subtree/onelevel&#34;/&gt;\n    &lt;ldapReference/&gt;\n</code></pre><p>\nWhen using dynamic references, caching is advised since dynamic group\nresolution can be expensive.\n</p><p>\nThe element &#34;idCase&#34; makes it possible to control the case of the\nidentifier on Nuxeo side. It accepts values &#34;upper&#34;, &#34;lower&#34; or\n&#34;unchanged&#34;. It is useful when changing case on the LDAP without affecting\nNuxeo (for rights management for instance which is case sensitive for\ninstance).\n</p><p>\nDependening on your LDAP Backend implementation, if you have some specific restriction\n(for example on password, or logins ...), you may want Nuxeo to handle the validation\nerrors of your server on the Nuxeo side.\n</p><p>\nSince there error code and message may vary  depending on the LDAP server provider, you\nmay need to provide a custom class that knows how to handle the Exceptions returned by it.\n</p><p>\nFor this you can specify a class that will be in charge of this task.\n</p><p></p><pre><code>    &lt;ldapExceptionHandler&gt;org.nuxeo.ecm.directory.ldap.DefaultLdapExceptionProcessor&lt;/ldapExceptionHandler&gt;\n</code></pre><p>\nThis class should implement org.nuxeo.ecm.directory.ldap.LdapExceptionProcessor and return\na RecoverableClientException for any exception that should be displayed to the user.\n</p><p>\nBy default, referrals will be automatically resolved, if you don&#39;t want that behavior (since 5.9.4) you can use the followReferrals tag\n</p><p>\n</p><pre><code>    &lt;directory name&#61;&#34;groupDirectory&#34;&gt;\n           ....\n           &lt;followReferrals&gt;false&lt;/followReferrals&gt;\n           ...\n        &lt;/directory&gt;\n</code></pre><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory/ExtensionPoints/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory--directories",
              "id": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory--directories",
              "label": "directories (org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory)",
              "name": "directories",
              "version": "2025.27.34"
            }
          ],
          "extensions": [],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
          "name": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
          "requirements": [
            "org.nuxeo.ecm.directory.DirectoryServiceImpl"
          ],
          "resolutionOrder": 600,
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory/Services/org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
              "id": "org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory",
              "overriden": false,
              "version": "2025.27.34"
            }
          ],
          "startOrder": 618,
          "version": "2025.27.34",
          "xmlFileContent": "<?xml version='1.0' encoding='UTF-8'?>\n<component name=\"org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory\">\n\n  <require>org.nuxeo.ecm.directory.DirectoryServiceImpl</require>\n\n  <documentation>\n    The LDAPDirectoryFactory component provides implementation of the\n    Directory API using an external LDAP server as storage backend,\n    typically to fetch users and groups data check password based\n    authentication.\n\n    @author Olivier Grisel (ogrisel@nuxeo.com)\n  </documentation>\n\n  <implementation class=\"org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory\"/>\n\n  <service>\n    <provide interface=\"org.nuxeo.ecm.directory.ldap.LDAPDirectoryFactory\"/>\n  </service>\n\n  <extension-point name=\"servers\">\n    <documentation>\n      The servers extension point is used to register network connection\n      parameters to a pool of LDAP servers.\n\n      Examples:\n\n      <code>\n        <server name=\"default\">\n          <ldapUrl>ldap://localhost:389</ldapUrl>\n          <ldapUrl>ldap://server2:389</ldapUrl>\n          <ldapUrl>ldaps://server3:389</ldapUrl>\n\n          <!-- LDAP SRV DNS resolution on _ldap._tcp.example.com -->\n          <ldapUrl>ldap:///dc=example,dc=com</ldapUrl>\n\n          <!-- LDAP SRV DNS resolution on _gc._tcp.example.com -->\n          <ldapUrl srvPrefix=\"_gc._tcp\">ldap:///dc=example,dc=com</ldapUrl>\n\n          <connectionTimeout>10000</connectionTimeout>\n          <retries>5</retries>\n\n          <poolingEnabled>true</poolingEnabled>\n          <poolingConnectionTimeout>60000</poolingConnectionTimeout>\n          <verifyServerCert>true</verifyServerCert>\n\n          <bindDn>cn=nuxeo5,ou=applications,dc=example,dc=com</bindDn>\n          <bindPassword>********</bindPassword>\n        </server>\n      </code>\n\n      The ldapUrl tags point to server (IP address or DNS name) and\n      ports. If more than one is provided, the Nuxeo EP will use a pool\n      of load balanced connections to each server. They are assumed to\n      be replicated versions of a master server that should belong to\n      the list.\n\n      The connectionTimeout element specifies a connection timeout in milliseconds.\n      The default is 10000.\n\n      The retries element indicates how many times the request will be retried\n      if LDAP server returns a ServiceUnavailableException. The default is 5.\n\n      The poolingEnabled element specifies whether to use LDAP connection pooling.\n      The default is true.\n\n      The poolingTimeout element specifies, in milliseconds, how long a connection\n      may remain in the pool when LDAP connection pooling is enabled.\n      The default is 60000.\n\n      The verifyServerCert element specifies whether, in SSL mode, all certificates\n      should be checked. This should only be disabled when testing with test server\n      having self-signed certificates. The default is true.\n\n      The bindDn and bindPassword credentials are used by Nuxeo EP to\n      access the content of the LDAP servers. It should have the read\n      permission to any entry that is to be used by Nuxeo EP and write\n      right to branches were Nuxeo EP is supposed to create or edit\n      entries.\n\n      For instance, in OpenLDAP you should have ACLs such as:\n\n      <code>\n        access to attrs=\"userPassword\"\n        by dn=\"cn=ldapadmin,dc=example,dc=com\" write\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by anonymous auth\n        by self write\n        by * none\n\n        access to dn.base=\"\" by * read\n\n        # nuxeo5 can manage the ou=people branch\n        access to dn.subtree=\"ou=people,dc=example,dc=com\"\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by users read\n        by self write\n        by * none\n\n        access to dn.subtree=\"ou=groups,dc=example,dc=com\"\n        by dn=\"cn=nuxeo5,ou=applications,dc=example,dc=com\" write\n        by users read\n        by self write\n        by * none\n\n        # The admin dn has full write access\n        # other\n        access to *\n        by dn=\"cn=ldapadmin,dc=example,dc=com\" write\n        by users read\n        by * none\n      </code>\n\n      User authentication is done using a bind method against the user\n      provided login and password from the login form and not the bindDn\n      / bindPassword credentials.\n    </documentation>\n\n    <object class=\"org.nuxeo.ecm.directory.ldap.LDAPServerDescriptor\"/>\n  </extension-point>\n\n  <extension-point name=\"directories\">\n    <documentation>\n      The directories extension point is used to register LDAP filtering\n      parameters to identify which part of the LDAP branches are actually\n      used by Nuxeo EP to fetch its entries.\n\n      Examples:\n\n      <code>\n        <directory name=\"userDirectory\">\n          <server>default</server>\n          <schema>user</schema>\n          <types>\n            <type>system</type>\n          </types>\n          <idField>username</idField>\n          <idCase>unchanged</idCase>\n          <passwordField>password</passwordField>\n          <passwordHashAlgorithm>SSHA</passwordHashAlgorithm>\n          <searchBaseDn>ou=people,dc=example,dc=com</searchBaseDn>\n          <searchClass>person</searchClass>\n          <searchFilter>(&amp;(sn=toto*)(myCustomAttribute=somevalue))</searchFilter>\n          <searchScope>onelevel</searchScope>\n\n          <readOnly>false</readOnly>\n\n          <cacheTimeout>3600</cacheTimeout>\n          <cacheMaxSize>1000</cacheMaxSize>\n\n          <creationBaseDn>ou=people,dc=example,dc=com</creationBaseDn>\n          <creationClass>top</creationClass>\n          <creationClass>person</creationClass>\n          <creationClass>organizationalPerson</creationClass>\n          <creationClass>inetOrgPerson</creationClass>\n          <rdnAttribute>uid</rdnAttribute>\n\n          <querySizeLimit>200</querySizeLimit>\n          <queryTimeLimit>0</queryTimeLimit>\n\n          <fieldMapping name=\"username\">uid</fieldMapping>\n          <fieldMapping name=\"password\">********</fieldMapping>\n          <fieldMapping name=\"firstName\">givenName</fieldMapping>\n          <fieldMapping name=\"lastName\">sn</fieldMapping>\n          <fieldMapping name=\"company\">o</fieldMapping>\n          <fieldMapping name=\"email\">mail</fieldMapping>\n\n          <references>\n            <inverseReference field=\"groups\" directory=\"groupDirectory\" dualReferenceField=\"members\"/>\n          </references>\n        </directory>\n\n        <directory name=\"groupDirectory\">\n          <server>default</server>\n          <schema>group</schema>\n          <idField>groupname</idField>\n          <searchBaseDn>ou=groups,dc=example,dc=com</searchBaseDn>\n          <searchFilter>(|(objectClass=groupOfUniqueNames)(objectClass=groupOfURLs))</searchFilter>\n          <searchScope>subtree</searchScope>\n\n          <!-- Special entry adaptor that makes entries in the ou=editable branch editable\n          other entries have the readonly flag. This require adding a \"dn\" xs:string field\n          to the group schema.\n          -->\n        <entryAdaptor class=\"org.nuxeo.ecm.directory.impl.WritePolicyEntryAdaptor\">\n          <parameter name=\"fieldName\">dn</parameter>\n          <parameter name=\"regexp\">.*,ou=editable,ou=groups,dc=example,dc=com</parameter>\n        </entryAdaptor>\n\n          <readOnly>false</readOnly>\n\n          <cacheTimeout>3600</cacheTimeout>\n          <cacheMaxSize>1000</cacheMaxSize>\n\n          <creationBaseDn>ou=editable,ou=groups,dc=example,dc=com</creationBaseDn>\n          <creationClass>top</creationClass>\n          <creationClass>groupOfUniqueNames</creationClass>\n          <rdnAttribute>cn</rdnAttribute>\n\n          <querySizeLimit>200</querySizeLimit>\n          <queryTimeLimit>0</queryTimeLimit>\n\n          <fieldMapping name=\"groupname\">cn</fieldMapping>\n\n          <references>\n            <!-- LDAP reference resolve DNs embedded in uniqueMember attributes\n\n              If the target directory has no specific filtering policy, it is most\n              of the time not necessary to enable the 'forceDnConsistencyCheck' policy.\n\n              Enabling this option will fetch each reference entry to ensure its\n              existence in the target directory.\n            -->\n            <ldapReference field=\"members\" directory=\"userDirectory\" forceDnConsistencyCheck=\"false\" staticAttributeIdIsDn=\"true\" staticAttributeId=\"uniqueMember\" dynamicAttributeId=\"memberURL\"/>\n\n            <ldapReference field=\"subGroups\" directory=\"groupDirectory\" forceDnConsistencyCheck=\"false\" staticAttributeId=\"uniqueMember\" dynamicAttributeId=\"memberURL\"/>\n\n            <inverseReference field=\"parentGroups\" directory=\"groupDirectory\" dualReferenceField=\"subGroups\"/>\n\n            <ldapTreeReference field=\"children\" directory=\"groupDirectory\" scope=\"onelevel\"/>\n            <inverseReference field=\"parents\" directory=\"groupDirectory\" dualReferenceField=\"children\"/>\n\n          </references>\n\n        </directory>\n      </code>\n\n      In the previous examples we configured two directories one for the\n      users and one for the groups of users. Each directory uses a\n      single schema which is to be registered as any core document\n      schema and that will be used to build a DocumentModel for each\n      matching entry of the directory.\n\n\n      Nuxeo EP provides group resolution for statically dn-referenced\n      entries (in read and write mode) and for dynamically ldapUrl\n      matched entries (readonly). You may also need to statically\n      reference entries without a dn using the 'staticAttributeIdIsDn'\n      attribute.\n\n      The references tags are used to dynamically build nxs:stringList\n      fields of that schema that are to compute membership relationships\n      between users and groups or between parent groups and sub groups.\n      It can also resole children and parents following the ldap tree\n      structure.\n\n      You have two ways for declaring a dynamic reference in a 'references' tag.\n      You can use 'dynamicAttributeId' to point to an ldap attribute that\n      contains an ldap url.\n\n      <code>\n      <ldapReference field=\"members\" directory=\"userDirectory\" dynamicAttributeId=\"memberURL\"/>\n      </code>\n\n      Or, you can use a subtag 'dynamicReference' to declare attributes that\n      contain a DN, a filter and a type. This values will be used to selected\n      the references.\n\n      <code>\n      <ldapReference field=\"members\" directory=\"userDirectory\"/>\n         <dynamicReference filter=\"ldapAttribute\" type=\"subtree/onelevel\" baseDN=\"ldapAttribute\"/>\n      <ldapReference/>\n      </code>\n\n      When using dynamic references, caching is advised since dynamic group\n      resolution can be expensive.\n\n      The element \"idCase\" makes it possible to control the case of the\n      identifier on Nuxeo side. It accepts values \"upper\", \"lower\" or\n      \"unchanged\". It is useful when changing case on the LDAP without affecting\n      Nuxeo (for rights management for instance which is case sensitive for\n      instance).\n\n\n      Dependening on your LDAP Backend implementation, if you have some specific restriction\n      (for example on password, or logins ...), you may want Nuxeo to handle the validation\n      errors of your server on the Nuxeo side.\n\n      Since there error code and message may vary  depending on the LDAP server provider, you\n      may need to provide a custom class that knows how to handle the Exceptions returned by it.\n\n      For this you can specify a class that will be in charge of this task.\n      <code>\n        <ldapExceptionHandler>org.nuxeo.ecm.directory.ldap.DefaultLdapExceptionProcessor</ldapExceptionHandler>\n      </code>\n      This class should implement org.nuxeo.ecm.directory.ldap.LdapExceptionProcessor and return\n      a RecoverableClientException for any exception that should be displayed to the user.\n\n\n      By default, referrals will be automatically resolved, if you don't want that behavior (since 5.9.4) you can use the followReferrals tag\n\n      <code>\n        <directory name=\"groupDirectory\">\n           ....\n           <followReferrals>false</followReferrals>\n           ...\n        </directory>\n      </code>\n\n    </documentation>\n\n    <object class=\"org.nuxeo.ecm.directory.ldap.LDAPDirectoryDescriptor\"/>\n  </extension-point>\n\n</component>",
          "xmlFileName": "/OSGI-INF/LDAPDirectoryFactory.xml",
          "xmlPureComponent": false
        }
      ],
      "fileName": "nuxeo-platform-directory-ldap-2025.27.34.jar",
      "groupId": "org.nuxeo.ecm.platform",
      "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.directory/org.nuxeo.ecm.directory.ldap",
      "id": "org.nuxeo.ecm.directory.ldap",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nCreated-By: 1.6.0_20 (Sun Microsystems Inc.)\r\nJava-Version: 21\r\nBuild-Jdk-Spec: 21\r\nBundle-ManifestVersion: 2\r\nExport-Package: org.nuxeo.ecm.directory.ldap,org.nuxeo.ecm.directory.lda\r\n p.dns,org.nuxeo.ecm.directory.ldap.filter\r\nPrivate-Package: org.nuxeo.ecm.directory.ldap.dns,org.nuxeo.ecm.director\r\n y.ldap.filter\r\nBundle-ActivationPolicy: lazy\r\nBundle-ClassPath: .\r\nBundle-Localization: bundle\r\nBundle-Name: Nuxeo ECM LDAP Directory\r\nBundle-RequiredExecutionEnvironment: JavaSE-1.6\r\nBundle-Vendor: Nuxeo\r\nEclipse-LazyStart: true\r\nBundle-Version: 0.0.0.SNAPSHOT\r\nNuxeo-Component: OSGI-INF/LDAPDirectoryFactory.xml,OSGI-INF/management-c\r\n ontrib.xml\r\nImport-Package: javax.naming,javax.naming.directory,org.apache.commons.l\r\n ang,org.apache.commons.logging,org.apache.directory.server.core.configu\r\n ration,org.apache.directory.server.core.jndi,org.apache.directory.serve\r\n r.core.partition,org.apache.directory.shared.ldap.filter,org.apache.dir\r\n ectory.shared.ldap.name,org.apache.directory.shared.ldap.schema,org.nux\r\n eo.common.utils,org.nuxeo.common.xmap,org.nuxeo.common.xmap.annotation,\r\n org.nuxeo.ecm.core;api=split,org.nuxeo.ecm.core.api;api=split,org.nuxeo\r\n .ecm.core.api.impl,org.nuxeo.ecm.core.api.model,org.nuxeo.ecm.core.mana\r\n gement.statuses,org.nuxeo.ecm.core.schema,org.nuxeo.ecm.core.schema.typ\r\n es,org.nuxeo.ecm.core.utils,org.nuxeo.osgi,org.nuxeo.runtime,org.nuxeo.\r\n runtime.api,org.nuxeo.runtime.model\r\nBundle-SymbolicName: org.nuxeo.ecm.directory.ldap;singleton:=true\r\nOriginally-Created-By: 1.6.0_20 (Sun Microsystems Inc.)\r\nRequire-Bundle: org.nuxeo.ecm.directory\r\n\r\n",
      "maxResolutionOrder": 600,
      "minResolutionOrder": 310,
      "packages": [],
      "requirements": [
        "org.nuxeo.ecm.directory"
      ],
      "version": "2025.27.34"
    }
  ],
  "creationDate": 1793873591050,
  "key": "Nuxeo Platform-2025.27",
  "name": "Nuxeo Platform",
  "operations": [],
  "packages": [],
  "pluginSnapshots": {},
  "releaseDate": 1793873591050,
  "version": "2025.27"
}